#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=1e5+7;
int T,n,m;
struct node{
	int x,y,val;
}a[Maxn];
bitset<Maxn>isp;
vector<int>prm;

void init(int N){
	isp.set(1),isp.set(0);
	for(int i=2;i<=N;i++){
		if(!isp.test(i)) prm.emplace_back(i);
		for(auto j:prm){
			const int t=i*j;
			if(t>N) break;
			isp.set(t);
			if(!(i%j)) break;
		} 
	}
}
inline bool check(int x){
	return (!isp.test(x)) and (x<=10 or x%20==3);
}

int main(){
	freopen("chess.in","r",stdin);
	freopen("chess.out","w",stdout);
	init(Maxn-7);
	
	scanf("%d",&T);
	while(T--){
		scanf("%d%d",&n,&m);

		for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
		for(int i=1;i<=n;i++) scanf("%d",&a[i].val);
		
		ll ans=0;
		
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				for(int k=j+1;k<=n;k++){
					int dis1=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y);
					int dis2=abs(a[i].x-a[k].x)+abs(a[i].y-a[k].y);
					int dis3=abs(a[j].x-a[k].x)+abs(a[j].y-a[k].y);
					int mid=dis1+dis2+dis3-max(max(dis1,dis2),dis3)-min(min(dis1,dis2),dis3);
					if(check(mid)) ans+=a[i].val+a[j].val+a[k].val;
				}
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

